package com.developer.logic.modulo.grupos;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.developer.core.utils.SimpleLogger;
import com.developer.logic.modulo.grupos.dto.Fase;
import com.developer.logic.modulo.grupos.dto.Grupo;
import com.developer.logic.modulo.partidos.PartidoServicio;
import com.developer.logic.modulo.partidos.dto.AlineacionPartido;
import com.developer.logic.modulo.partidos.dto.Partido;
import com.developer.mybatis.DBManager;
import com.developer.persistence.modulo.grupos.GrupoControllerDB;
import com.developer.persistence.modulo.partidos.PartidoControllerDB;

public class GrupoServicio {
	
	private static GrupoServicio instance;
	
	public static GrupoServicio getInstance() {
		if (instance == null) {
			instance = new GrupoServicio();
		}
		
		return instance;
	}
			
	public List<Fase> getFases(){
		
		GrupoControllerDB controllerDB = GrupoControllerDB.getInstance();
		List<Fase> listaFases= controllerDB.getFases();
		
		return listaFases;
	}
	
	public List<Fase> getFasesActivas(){
		
		GrupoControllerDB controllerDB = GrupoControllerDB.getInstance();
		List<Fase> listaFases= controllerDB.getFasesActivas();
		
		return listaFases;
	}
	
	public Grupo getGrupo(Long idGrupo){
		
		GrupoControllerDB controllerDB = GrupoControllerDB.getInstance();
		Grupo grupo = controllerDB.getGrupo(idGrupo);
		
		completarInformacionGrupo(grupo);
		
		
		return grupo;
	}
	
	public List<Grupo> getGrupos(){
		
		GrupoControllerDB controllerDB = GrupoControllerDB.getInstance();
		List<Grupo> grupos = controllerDB.getGrupos();
		
		if(grupos!= null && grupos.size()>0){
		
			for (Grupo grupoConsultado : grupos) {
				completarInformacionGrupo(grupoConsultado);
				
			}
		}
		
		
		return grupos;
	}
	
	public List<Grupo> getGruposPorFase(Fase fase){
		
		GrupoControllerDB controllerDB = GrupoControllerDB.getInstance();
		List<Grupo> grupos = controllerDB.getGruposPorFase(fase);
		
		if(grupos!= null && grupos.size()>0){
		
			for (Grupo grupoConsultado : grupos) {
				completarInformacionGrupo(grupoConsultado);
				
			}
		}
		
		
		return grupos;
	}
	
	
	
	public Grupo crearGrupoTransaccional(Grupo grupo, List<Long> idsEquipos, StringBuffer mensajeError){
		SqlSession session = DBManager.openSession();
		
		try {
			
			Boolean sinErrores = true;
			
			Long idGrupo = GrupoControllerDB.getInstance().getSiguienteIDGrupo();
			grupo.setGrupo(idGrupo);
			
			sinErrores = GrupoControllerDB.getInstance().crearGrupoTransaccional(session, grupo) && sinErrores;
						
			if (sinErrores) {
				
				//Se crean los partidos de cada grupo sin sede y fecha de programacion
				PartidoServicio partidoServicio = PartidoServicio.getInstance();
				
				for (int i = 0; i < idsEquipos.size(); i++) {
					for (int j = i+1; j < idsEquipos.size(); j++) {
						
						Partido partido = new Partido();
						partido.setDescri("Partido 1 del "+grupo.getNombre());
						partido.setEquipo_1(idsEquipos.get(i));
						partido.setEquipo_2(idsEquipos.get(j));
						partido.setEstado(Partido.ESTADO_CREADO);
						partido.setGrupo(grupo.getGrupo());
												
						partido = partidoServicio.crearPartidoTransaccional(session, partido, mensajeError);
						
						if(partido==null){
							 sinErrores = false;
						}
						
					}
				}
				
				//Si no existen errores se finaliza la transaccion
				if(sinErrores){
					
					session.commit();
				}else{
					grupo = null;
					session.rollback();
				}
						
			}else{
				session.rollback();
				mensajeError.append("Error creando grupo. No ha sido posible crear el registro forma correcta");
				return null;
			}
			
			
			return grupo;

		}catch (Exception e) {
			session.rollback();
			SimpleLogger.error("Error ", e);
			mensajeError.append("Error creando grupo. No se ha podido finalizar correctamente.");
			
			return null;
			
			
		} 	finally {
			session.close();
		}
		
		
		
	}
	
	public Fase getFase(Long idFase){
		
		GrupoControllerDB controllerDB = GrupoControllerDB.getInstance();
		Fase fase= controllerDB.getFase(idFase);
		
		return fase;
	}
	
	
	public Fase inactivarFase (SqlSession session, Fase fase, StringBuffer mensajeError){
		try {
			
			Boolean sinErrores = true;
			
			sinErrores = GrupoControllerDB.getInstance().inactivarFaseTransaccional(session, fase);
			
			if(sinErrores){
				
				return fase;
			}else{
				
				mensajeError.append("Error creando el inactivarFase.");
				return null;
			}
	
		}catch (Exception e) {
			session.rollback();
			SimpleLogger.error("Error ", e);
			mensajeError.append("Error inactivando fase. No se ha podido finalizar correctamente.");
			
			return null;
			
			
		} 	
	}
	
	
	private void completarInformacionGrupo(Grupo grupo){
		
		//Informa
		Fase fase = getFase(grupo.getFase());
		grupo.setFaseAsociada(fase);
		
	}

}
